package com.data.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.data.dto.DataInfoQueryDTO;
import com.data.entity.DataInfo;
import com.data.mapper.DataInfoMapper;
import com.data.service.DataInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

@Service
@Slf4j
public class DataInfoServiceImpl extends ServiceImpl<DataInfoMapper, DataInfo> implements DataInfoService {

    @Resource
    private DataInfoMapper baseMapper;

    @Override
    public void importExcel(MultipartFile file) throws IOException {
        try {
            List<DataInfo> dataList = parseExcel(file);
            if (dataList.isEmpty()) {
                throw new IllegalArgumentException("文件为空");
            }

            log.info("共解析到 {} 条数据，开始分批导入", Optional.of(dataList.size()));

            // 分批大小：建议 500~1000（如果 content 很大，甚至用 100）
            int batchSize = 500;

            for (int i = 0; i < dataList.size(); i += batchSize) {
                int end = Math.min(i + batchSize, dataList.size());
                List<DataInfo> subList = dataList.subList(i, end);

                try {
                    baseMapper.insertIgnore(subList);
                    log.info("第 {} 批导入完成，{} 条", Optional.of((i / batchSize) + 1), Optional.of(subList.size()));
                } catch (Exception e) {
                    log.error("第 {} 批导入失败", Optional.of((i / batchSize) + 1), e);
                    // 可选择继续或中断
                }
            }

            log.info("✅ 全部导入完成");

        } catch (IOException e) {
            throw new RuntimeException("解析文件失败", e);
        }
//        try {
//            // 创建监听器
//            DataInfoImportListener listener = new DataInfoImportListener(baseMapper);
//
//            // 读取 Excel
//            EasyExcel.read(file.getInputStream(), listener)
//                    .sheet()
//                    .doRead();
//
//            // 获取去重后的数据并批量保存
//            List<DataInfo> dataList = listener.getDataList();
//            if (!dataList.isEmpty()) {
//                // 使用 MyBatis Plus 批量插入
//                saveBatchMethod(dataList);
//            }
//
//        } catch (IOException e) {
//            throw new RuntimeException("Excel文件读取失败", e);
//        }
    }

    // 假设你有 saveBatch 方法（使用 IService）
    private void saveBatchMethod(List<DataInfo> list) {
        this.saveBatch(list);
        // 如果你继承了 IService<DataInfo>，可以直接用 this.saveBatch(list)
        // 否则调用 baseMapper.insertBatchSomeColumn(...) 手动实现
    }
    @Override
    public IPage<DataInfo> listByPage(DataInfoQueryDTO query) {
        buildProcessedKeyword(query);
        Page<DataInfo> page = new Page<>(query.getPage(), query.getSize());
        return baseMapper.selectPageByCondition(page, query);
    }

    @Override
    public List<DataInfo> findAll() {
        return this.list();
    }

    @Override
    public List<String> getDictOptions(Integer dictType) {
        // 查询数据库
        List<String> options = baseMapper.selectDictOptions(dictType);

        // 过滤 null 并去重（虽然 DB 已 DISTINCT）
        List<String> result = options.stream()
                .filter(Objects::nonNull)
                .distinct()
                .sorted() // 可选：按字母排序
                .collect(Collectors.toList());
        return result;
    }

    /**
     * 解析 Excel 文件，返回 List<DataInfo>
     */
    private List<DataInfo> parseExcel(MultipartFile file) throws IOException {
        // 使用 EasyExcel、Apache POI 等解析
        // 示例伪代码：
        List<DataInfo> list = new ArrayList<>();
        try (Workbook workbook = WorkbookFactory.create(file.getInputStream())) {
            Sheet sheet = workbook.getSheetAt(0);
            for (Row row : sheet) {
                if (row.getRowNum() == 0) {
                    // 跳过标题行
                    continue;
                }
                DataInfo data = new DataInfo();
                data.setNumber(getCellValue(row.getCell(0)));  // A
                data.setTitle(getCellValue(row.getCell(1)));    // B
                data.setLink(getCellValue(row.getCell(2)));     // C
                data.setSource(getCellValue(row.getCell(3)).replaceAll("来源：","").replaceAll("来源:",""));   // D
                data.setTimeStr(getCellValueDate(row.getCell(4)));  // E
                data.setContent(getCellValue(row.getCell(5)));   // F
                data.setKeyword1(getCellValue(row.getCell(6)));  // G
                data.setKeyword2(getCellValue(row.getCell(7)));  // H
                data.setKeyword3(getCellValue(row.getCell(8)));  // I
                data.setKeyword4(getCellValue(row.getCell(9))); // J
                data.setKeyword5(getCellValue(row.getCell(10))); // K
                data.setKeyword6(getCellValue(row.getCell(11))); // L
                data.setCollectSource(getCellValue(row.getCell(12))); // M
                list.add(data);
            }
        }
        return list;
    }
    public void buildProcessedKeyword(DataInfoQueryDTO query) {
        String keyword = query.getKeyword();
        Integer searchMode = query.getSearchMode();

        // 如果没有关键词，不用处理
        if (keyword == null || keyword.trim().isEmpty()) {
            query.setProcessedKeyword(null);
            return;
        }
        keyword = keyword.trim();
        if (searchMode != null && searchMode == 2) {
            // === 按字搜索模式 ===
            // 把每个字用 * 包裹，变成：*人* *工* *智* *能*
            String[] chars = keyword.split("");
            StringBuilder sb = new StringBuilder();

            for (String c : chars) {
                if (!c.isEmpty()) {
                    sb.append("*").append(c).append("* ");
                }
            }
            // 去掉末尾空格
            String boosted = sb.toString().trim();
            query.setProcessedKeyword(boosted);

        } else {
            // === 按词搜索模式 ===
            // 直接使用原关键词
            query.setProcessedKeyword(keyword);
        }
    }
    private String getCellValue(Cell cell) {
        if (cell == null) {
            return null;
        }
        cell.setCellType(CellType.STRING);
        return cell.getStringCellValue().trim();
    }
    private String getCellValueDate(Cell cell) {
        if (cell == null) {
            return null;
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();

            case NUMERIC:
                double value = cell.getNumericCellValue();

                // 👇 智能推断：如果数值在 45000~46000 之间，认为是 Excel 日期（2025年）
                if (value >= 36000 && value <= 50000) {
                    try {
                        java.util.Date date = DateUtil.getJavaDate((int) value);
                        LocalDate localDate = date.toInstant()
                                .atZone(ZoneId.systemDefault())
                                .toLocalDate();
                        return localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                    } catch (Exception e) {
                        log.warn("日期转换失败: {}", Optional.of(value));
                    }
                }

                // 其他数值：可能是编号、分数等，转成字符串
                if (value == Math.floor(value)) {
                    return String.valueOf((long) value); // 整数
                } else {
                    return String.valueOf(value);       // 小数
                }

            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            default:
                return null;
        }
    }

}